home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
tex
/
ddjgrep.zip
/
BITMAP.C
next >
Wrap
Text File
|
1987-11-04
|
2KB
|
118 lines
/* BITMAP.C makebitmap, setbit, testbit: bit map manipulation
* routines.
*
* Copyright (c) 1985, Allen I. Holub, all rights reserved.
* This program may be copied for personal, non-profit use only.
*/
extern char *calloc ( unsigned, unsigned );
#ifdef DEBUG
#include <stdio.h>
#endif
typedef char BITMAP;
/*----------------------------------------------------------------------*/
BITMAP *makebitmap( size )
unsigned size;
{
/* Make a bit map with "size" bits. The first entry in
* the map is an unsigned int representing the maximum
* bit. The map itself is concatenated to this integer.
* Return a pointer to the map on success, 0 if there's
* not enough memory.
*/
unsigned *map, numbytes;
numbytes = (size >> 3) + ((size & 0x07) ? 1 : 0 ) ;
#ifdef DEBUG
printf("Making a %d bit map (%d bytes required)\n", size, numbytes);
#endif
if( map = (unsigned *) calloc( numbytes + sizeof(unsigned) ,1 ) )
*map = size;
return (BITMAP *) map;
}
setbit( c, map, val )
unsigned c, val;
char *map;
{
/* Set bit c in the map to val.
* If c > map size, 0 is returned, else 1 is returned.
*/
if( c >= *(unsigned *)map ) /* if c >= map size */
return 0;
map += sizeof(unsigned); /* Skip past size */
if( val )
map[c >> 3] |= 1 << (c & 0x07) ;
else
map[c >> 3] &= ~(1 << (c & 0x07)) ;
return( 1 );
}
/* ------------------------------------------------------------------- */
testbit( c, map )
unsigned c;
char *map;
{
/* Return 1 if the bit corresponding to c in map is set.
* 0 if it is not.
*/
if( c >= *(unsigned *)map )
return 0;
map += sizeof(unsigned);
return( map[ c >> 3 ] & (1 << (c & 0x07)) );
}
#ifdef DEBUG
main()
{
int bitnum, set, i, *map;
printf("Making a 32 bit wide bit map\n");
if( !(map = makebitmap( 32 )) )
printf("Can't make map\n");
while( 1 )
{
/* Print the bit map. Try to print past the end of the
* map to make sure overflow detection works (bit 32 should
* come back as a 0).
*/
for( i = 0; i <= 32 ; i++ )
putchar( testbit( i, map ) ? 'X' : '.' );
printf("\n\nBit number :");
scanf("%d", &bitnum );
printf("\n1 to set, 0 to clear: ");
scanf("%d", &set );
if( ! setbit(bitnum, map, set) )
printf("Bit out of range\n");
}
}
#endif